# 函数就是一堆准备好的代码 在需要的时候调用即可
"""
age = int(input("请输入你的年龄"))

if age >=0 and age<3: # 3岁以下，不包括三岁，执行这里
    for i in range(3): # 循环三次儿歌
        print("小兔子乖乖")
        print("把门儿开开")
        print("快点儿开开")
        print("我要进来")
elif 5>age >=3: # 年龄大于等3岁并且年龄小于5岁，打印一遍儿歌
    print("小兔子乖乖")
    print("把门儿开开")
    print("快点儿开开")
    print("我要进来")
"""
def text(): # 定义了一个函数
    print("小兔子乖乖")
    print("把门儿开开")
    print("快点儿开开")
    print("我要进来")
"""
def 函数名称():
    函数体

定义好以后，没调用，相当于没有这个函数
"""
"""
# 调用函数
text() 
text() 
text() 
"""
"""
age = int(input("请输入年龄"))
if age>0 and age<3:
    for i in range(3):
        text()
elif 5>age>=3:
    text()
    """

# ========================== 无参数，无返回值的=====================
"""
def info():
    print("大家好，我叫小白，今年18岁")
print(info())  # 会多一个None，说明这个是没有返回值的
"""
# ========================== 无参数，有返回值的=====================
def tianqi():
    """
    :return: 一个函数只会有一个return。如果存在多个，那么一定是有分支判断的
    """
    r = input("请输入今天的天气：")
    if r == "晴天":
        return "今天是晴天"  # return是返回值，代码执行到此，后面就不会再运行了
        print("啦啦啦啦") # 不会执行这个代码
    elif r == "阴天":
        return "今天是阴天"
# print(tianqi())
def info1():
    return "大家好"
    return "我叫小白"  # 这个就不会执行了。一个函数只会执行一个return

# print(info1())

#========================== 有参数，有返回值的=====================
def classinfo(cls)->str: # cls就是自己定义的参数，再调用这个函数的时候，需要传递的
    """
    :param cls:
    :return: ->str 返回的类型是字符串。提醒程序员的
    """
    if cls == '3' or cls ==3:
        print("QC3期正在学习自动化测试代码")
        return "QC3"
    elif cls == '2' or cls == 2:
        print("QC2期正在就业")
        return "QC2"
    elif cls=='4' or cls==4:
        print("QC4期正在学习")
        return "QC4"
# cl3 = classinfo(3) # QC3
# print(cl3 + "正在学习") # "QC3" + "正在学习"；相当于字符串相加

# 计算器
def jisuan(math:str,a:int,b:int)->int:
    """
    :param math: 运算方式。提醒程序员，这个是str类型传参格式
    :param a: 输入计算的第一个数。提醒程序员，这个是int类型的
    :param b: 第二个数。提醒程序员，这个是int类型的
    :return: 运算结果。返回的是int类型
    """
    if math =='+':
        return a+b
    elif math == '-':
        return a-b
    elif math == '*':
        return a*b
    elif math=='//':
        r = a // b
        return r
    elif math =="**":
        return a**b
# 按照函数默认的顺序传参
# print(jisuan('+', 5, 6)) # 5+6
# 打乱顺序传参。指名道姓的进行传参
# print(jisuan(a=10, b = 12, math='-')) # 10-12

def stu_info(age:int,name:str,address:str='沈阳')->str:
    """
    :param age: 形参age
    :param name: 形参name
    :param address: 默认参数要放到最后面
    :return:
    """
    return f"大家好，我叫：{name},今年：{age}，来自：{address}"

# print(stu_info(19, "小张")) # 19 "小张"，这两个叫做实参
# print(stu_info(19, "小李","鞍山"))

#========================== 有参数，没有返回值的=====================
def clsinfo(cls):
    if cls=='3':
        print("沁创3期正在学习")
# clsinfo(3)
# ========================不定长参数传递==========================
def arraylist(*args): # 正常的参数前面+一个*，表示接受不定长
    print(args) # 返回值是元组类型
# arraylist(10,20,30,40,"小白",[10,20,30],{1,2,3},(1,2,3),{"name":"suki"})
def arrayList(a,b,*arraylist1):
    print(a)
    print(b)
    print(arraylist1)

# arrayList(10,20,30,40,100,99)
"""
a = 10
b = 20
arraylist1 = (30,40,100,99)
"""
# =====================不定长关键字参数=====================
def func(**kwargs):# 传参必须要字典的方式传递。key和value
    print(kwargs) # 返回类型也是字典
    return kwargs
# print(func(name='suki', age=19, address='沈阳', 手机号='1592877223'))

def func1(*args,**kwargs):
    print(args) # (10,20,30,40,{"name":"suki"})
    print(kwargs) # {}
func1(10,20,30,40,{"name":"suki"},name='suki')
